/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ptolemaiosz;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Mattias
 */
public class SkeletonController {
   
    //Az alap 3 objektumot valahol tartolni kell, hogy 2 usecase inculde között ne vesszen el
    static Application application = null;
    static LevelPartManager levelPartManager = null;
    static Initializer initializer = null;
    
    /*
     *  AZ inicializálás szekvencia
     */
    static void SEQinitialize()
        {
            /*
             *  Ez a szekvencia direkt nem egy adott fugvenyt hiv meg
             *  Ennek az az oka, hogy ez a majdani prototipus main belepesi fuggvenye lenne,
             *  illetve annak a belseje van itt megvalositva.
             *  Erre lehetne csinalni egy kulon osztalyt egy main fuggvennyel,
             *  de valahol akkor is lekene tarolni a letrehozott alap vezerlo objektumokat.
             *  Persze abban az osztalyban, tiszta sor, de akkor meg a tobbi szekvenciaban
             *  kene arra az osztalyra hivatkozni.
             * 
             *  Egy szo mint szaz, konnyen belathato hogy ez az egy szekvencia nem tartalmazhat
             *  csak egy fuggvenyhivast, s ez NEM HIBA.
             *  
             */ 
            
            application = new Application();
            levelPartManager = new LevelPartManager();
            initializer = new Initializer();
            Physics physics = new Physics();
            
            application.setLevelPartManager(levelPartManager);
            application.setInitializer(initializer);
            application.setPhysics(physics);
            
            initializer.setApplication(application);
            
            //initializer.loadLevel(i); //Ezt mar a buildmap tartalmazza
            /*
             * Ha odateszed, akkor lefut a buildmap is, az meg rossz.
             * Ha meg csak kiirna, de nem futtatna, akkor build map eseten 2x lenne kiirva.         
             * Ha meg letiltoed a loggert a hivas sem latszik, ezert igy a jo...
             */
            
            
        }
            
            
    
     /*
     *  A palya felepitese szekvencia
     */    
    static void SEQbuildMap(boolean isInclueded, int i)
        {
            SkeletonLogger.disable();
                
                SkeletonLogger.logRef("INITIALIZE");
                SEQinitialize();                
           
            if(!isInclueded)
                SkeletonLogger.enable();
            
            //A pálya felépítése 
            initializer.loadLevel(i);
        }
    
     /*
     *  A vilag szimulacio  szekvencia
     */    
    static void SEQwordSimulation()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,3);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            SkeletonLogger.disable();  
                Physics p = application.getPhysics();
            SkeletonLogger.enable();
            
            p.update();
        }
    /*
     *  Az avatar mozgatasa szekvencia
     */
        static void SEQmoveAvatar()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,3);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            application.moveAvatar(Direction.down);
        }
        
        
     /*
     *  A kulcsralépés szekvencia
     */
        static void SEQkeyInteraction()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,4);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            //Elkerjuk az aktualis elemeket a palyatol
            SkeletonLogger.disable();
                ArrayList<Element> elements = levelPartManager.getLevel().getCurrentLevelPart().getElements();
            SkeletonLogger.enable();
            
            Key key = null;
            
            //Kikeressuk belole az utolso kulcsot
            for(int i = 0;i< elements.size();i++)
                {
                   if(elements.get(i).getClass().getCanonicalName().equals("Ptolemaiosz.Key"))
                        key = (Key) elements.get(i);
                }
            
           //Ha van kulcs, akkor ralepunk, ha nincs, jelezzuk
           if(key == null)
               System.out.println("Nincs kulcs az aktualis palyaszakaszon, nem tudok ralepni!");
           else
               key.interaction(null);
           
        }
        
        
      static void SEQdoorInteraction()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,5);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            //Elkerjuk az aktualis elemeket a palyatol
            SkeletonLogger.disable();
                ArrayList<Element> elements = levelPartManager.getLevel().getCurrentLevelPart().getElements();
            SkeletonLogger.enable();
            
            Door door = null;
            
            //Kikeressuk belole az utolso ajtot
            for(int i = 0;i< elements.size();i++)
                {
                   if(elements.get(i).getClass().getCanonicalName().equals("Ptolemaiosz.Door"))
                        door = (Door) elements.get(i);
                }
            
           //Ha van ajto ralepunk, ha nincs, jelezzuk
           if(door == null)
               System.out.println("Nincs ajto az aktualis palyaszakaszonm, nem tudok ralepni!");
           else
               door.interaction(null);
           
        }
      
     /*
     *  A fal utkozese egyeb objektummal szekvencia
     */
        static void SEQwallCollision()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,3);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            //Szerzunk egy flat az objektumok kozul, meg egy avatart is
            SkeletonLogger.disable();
                PhysicalEntity wall = levelPartManager.getLevel().getCurrentLevelPart().getWalls().get(0).getPhysicalEntity();
                PhysicalEntity avatar = levelPartManager.getLevel().getAvatar().getPhysicalEntity();
            SkeletonLogger.enable();
            
           //Az avatar beleutkozik a falba, ezt jelezzuk a falnak
           wall.collision(avatar);
           
        }
        
     /*
     *  A fizikai entitasok lekerese szekvencia
     */
        static void SEQqueryPhisicalEntities()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,3);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();  
            
            SkeletonLogger.disable();
                Ptolemaiosz.Level level = levelPartManager.getLevel();
           SkeletonLogger.enable();
           
           level.getPhysicalEntities();
           
        }
        
     /*
     *  Nezetvaltas szekvencia
     */
        static void SEQchangeViewMode()
        {
            SkeletonLogger.disable();
                SEQbuildMap(true,3);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            application.chageViewMode();
        }
        
     /*
     *  szakaszok tologatasa szekvencia
     */
        static void SEQslide()
        {
            SkeletonLogger.disable();                
                SEQbuildMap(true,1);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            application.moveLevelPart(Direction.down);
        }
    
     /*
     *  palya ujrainditas szekvencia
     */
        static void SEQrestartLevel()
        {
            SkeletonLogger.disable();
                SEQbuildMap(true,1);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            application.restartLevel();
        }
        
     /*
     *  palya atugrasa szekvencia
     */
        static void SEQskipLevel()
        {
            SkeletonLogger.disable();
                SEQbuildMap(true,1);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            application.nextLevel();
        }
        
     /*
     *  UtkozesDetektalas szekvencia
     */
        static void SEQcollisionDetection()
        {
            SkeletonLogger.disable();
                SkeletonLogger.logRef("BUILD MAP");
                SEQbuildMap(true,3);
            SkeletonLogger.enable();
            
            //Le kell kerni a fizikat, higy meg tudjuk hivni egy fv.-et
            SkeletonLogger.disable();
                Physics p = application.getPhysics();
            SkeletonLogger.enable();
            
            p.collisionDetection();
        } 
    
     /*
     *  IlleszkedesVizsglat szekvencia
     */
        static void SEQmatchChecker()
        {
            SkeletonLogger.disable();
                SEQbuildMap(true,1);
                SkeletonLogger.logRef("BUILD MAP");
            SkeletonLogger.enable();
            
            levelPartManager.matchChecker(Direction.down);
        }
        
     /*
     *  Fizikia entitások frissitese szekvencia
     */
        static void SEQupdatePhysicsalEntities()
        {
            SkeletonLogger.disable();
                SkeletonLogger.logRef("BUILD MAP");
                SEQbuildMap(true,3);
            SkeletonLogger.enable();
            
             //Le kell kerni a fizikat, higy meg tudjuk hivni egy fv.-et
             SkeletonLogger.disable();
                PhysicalEntity p = levelPartManager.getLevel().getPhysicalEntities().get(0);
             SkeletonLogger.enable();
            
                p.update(100);
        } 
    
    
    static boolean question(String s)
        {
            
            if(!SkeletonLogger.getEnabled())
                return false;
            
            try {
                
                String c = "";
                SkeletonLogger.display();
                
                while(!c.equals("y") || !c.equals("n"))
                    {
                        //Megcsináljuk a behúzásokat, életvonalakat
                        for(int i = 0;i<SkeletonLogger.getIndent()+1;i++) 
                            System.out.print("\t|");
                        
                        System.out.print(" QUESTION: " + s + " (y/n)" + "\r\n");
                        
                        //Megcsináljuk a behúzásokat, életvonalakat
                        for(int i = 0;i<SkeletonLogger.getIndent()+1;i++) 
                            System.out.print("\t|");
                        
                        System.out.print(" ANSWER: ");

                        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                        c = br.readLine();

                        if(c.equals("y"))
                            {                                
                                return true;
                            }
                        else if(c.equals("n"))
                            {
                                return false;
                            }
                }


            } catch (IOException ex) {
                Logger.getLogger(SkeletonController.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            return true;
        }
    
    public static void Menu()
        {
            class menuElement
                {
                    String name = "";
                    String ch = "";
                    
                    menuElement(String c, String s)
                        {
                            name = s;
                            ch = c;
                        }
                    
                    public void display()
                        {
                            System.out.println(ch + " => " + name);
                        }
                   };
            
            ArrayList<menuElement> elements = new ArrayList();
            
            elements.add(new menuElement("a", "Inicializalas"));            
            elements.add(new menuElement("b", "Vilag szimulacio"));
            elements.add(new menuElement("c", "Mozgatas"));
            elements.add(new menuElement("d", "Nezetvaltas"));
            elements.add(new menuElement("e", "Palyaszakaszok tologatasa"));
            elements.add(new menuElement("f", "Palya ujrainditasa"));
            elements.add(new menuElement("g", "Palya atugrasa"));
            elements.add(new menuElement("h", "Palya felepitese"));
            elements.add(new menuElement("i", "Kulcsralepes"));
            elements.add(new menuElement("j", "Ajtoralepes"));
            elements.add(new menuElement("k", "Fal utkozese egyeb objektummal"));
            elements.add(new menuElement("l", "Utkozesdetektalas"));
            elements.add(new menuElement("m", "Fizikai entitasok lekereses"));
            elements.add(new menuElement("n", "Illeszkedes vizsgalat"));
            elements.add(new menuElement("p", "Fizikai entitasok frissitese"));
            elements.add(new menuElement("x", "Kilepes"));
            
            
            System.out.println("\r\nValasszon az alabbi lehetosegek kozul: \r\n ");
            
            for(int i =0; i < elements.size();i++)
                {
                    elements.get(i).display();
                }
            
            System.out.println("\r\nUsse be a valasztott lehetoseg elott lathato karaktert, majd nyomjon entert az inditashoz: \r\n ");
        
            //Egy karakter beolvasasa
            String c = "";
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                c = br.readLine();
            } catch (IOException ex) {
                Logger.getLogger(SkeletonController.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            if(!c.equals("x"))
                    SkeletonLogger.setEmptylines(question("Akarsz ures sorokat a fugvenyhivasok kozott? Atlathatobb de hosszu lesz..."));
            
            switch (c) 
                {
                    case "a":  SEQinitialize();
                               SkeletonLogger.display();
                               break;
                    case "b":  SEQwordSimulation();
                               SkeletonLogger.display();
                               break;
                    case "c":  SEQmoveAvatar();
                               SkeletonLogger.display();
                               break;
                    case "d":  SEQchangeViewMode();
                               SkeletonLogger.display();
                               break;
                    case "e":  SEQslide();
                               SkeletonLogger.display();
                               break;
                    case "f":  SEQrestartLevel();
                               SkeletonLogger.display();
                               break;
                    case "g":  SEQskipLevel();
                               SkeletonLogger.display();
                               break;
                    case "h":  SEQbuildMap(false,4);
                               SkeletonLogger.display();
                               break;
                    case "i":  SEQkeyInteraction();
                               SkeletonLogger.display();
                               break;
                    case "j":  SEQdoorInteraction();
                               SkeletonLogger.display();
                               break;
                    case "k":  SEQwallCollision();
                               SkeletonLogger.display();
                               break;
                    case "l":  SEQcollisionDetection();
                               SkeletonLogger.display();
                               break;
                    case "m":  SEQqueryPhisicalEntities();
                               SkeletonLogger.display();
                               break;
                    case "n":  SEQmatchChecker();
                               SkeletonLogger.display();
                               break;
                    case "p":  SEQupdatePhysicsalEntities();
                               SkeletonLogger.display();
                               break;
                    case "x":  System.exit(0);
                               break;
                    default: break;
               
                }
            
            
            //Menu meghivasa ujra
            Menu();
         
            
  }
    
}